/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.financeiro.view;

import br.jm.financeiro.base.eao.EaoException;
import br.jm.financeiro.datamodel.LazySelectedAssunto;
import br.jm.financeiro.datamodel.LazySelectedClassificao;
import br.jm.financeiro.datamodel.LazyTituloRelatorio;
import br.jm.financeiro.entity.Assunto;
import br.jm.financeiro.entity.CentroCusto;
import br.jm.financeiro.entity.Cliente;
import br.jm.financeiro.entity.ContaPagar;
import br.jm.financeiro.entity.ContaPagarParcela;
import br.jm.financeiro.entity.ContaReceber;
import br.jm.financeiro.entity.ContaReceberParcela;
import br.jm.financeiro.entity.Empreendimento;
import br.jm.financeiro.entity.Empresa;
import br.jm.financeiro.entity.Fornecedor;
import br.jm.financeiro.entity.PropostaValor;
import br.jm.financeiro.entity.PropostaValorPerc;
import br.jm.financeiro.entity.RelatorioFinanceiro;
import br.jm.financeiro.entity.TituloRelatorio;
import br.jm.financeiro.entity.Usuario;
import br.jm.financeiro.filter.Conecta;
import br.jm.financeiro.filter.Funcoes;
import br.jm.financeiro.filter.UtilFaces;
import br.jm.financeiro.sistema.eao.AssuntoEao;
import br.jm.financeiro.sistema.eao.CentroCustoEao;
import br.jm.financeiro.sistema.eao.ClienteEao;
import br.jm.financeiro.sistema.eao.ContaPagarEao;
import br.jm.financeiro.sistema.eao.ContaReceberEao;
import br.jm.financeiro.sistema.eao.EmpreendimentoEao;
import br.jm.financeiro.sistema.eao.EmpresaEao;
import br.jm.financeiro.sistema.eao.FornecedorEao;
import br.jm.financeiro.sistema.eao.PropostaValorEao;
import br.jm.financeiro.sistema.eao.PropostaValorPercEao;
import br.jm.financeiro.sistema.eao.RelatorioFinanceiroEao;
import br.jm.financeiro.sistema.eao.TituloRelatorioEao;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer;
import net.sf.jasperreports.engine.fill.JRGzipVirtualizer;
import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;
import org.primefaces.model.LazyDataModel;

/**
 *
 * @author joao
 */
public class RelatorioBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private final EmpresaEao EmpresaJpa;
    private final ClienteEao ClienteJpa;
    private final FornecedorEao FornecedorJpa;
    private final EmpreendimentoEao empreendimentoJpa;
    private final CentroCustoEao centroCustoJpa;
    private final RelatorioFinanceiroEao RelatorioFinanceiroJpa;
    private final PropostaValorEao propostaValorJpa;
    private final PropostaValorPercEao propostaValorPercJpa;
    private final ContaReceberEao contaReceberJpa;
    private final ContaPagarEao contaPagarJpa;
    private final TituloRelatorioEao tituloRelatorioJpa;
    private HttpSession session;
    private FacesContext ctx;
    private List<Cliente> clienteList = new ArrayList<>();
    private LazySelectedClassificao lazyCliente;
    private Cliente[] selectedClientes;
    private List<Assunto> assuntoList = new ArrayList<>();
    private LazySelectedAssunto lazyAssunto;
    private Assunto[] selectedAssuntos;
    private final AssuntoEao assuntoEAO;
    private FacesMessage msg;
    private String status;
    private List<String> selectedStatus;
    private List<String> selectedTipo;
    private List<String> selectedTipoDocumento;
    private DualListModel<Empresa> empresaPicks;
    private DualListModel<Cliente> clientePicks;
    private DualListModel<Fornecedor> fornecedorPicks;
    private DualListModel<Empreendimento> empreendimentoPicks;
    private DualListModel<CentroCusto> centroCustoPicks;
    private boolean lcliente;
    private boolean lfornecedor;
    private Date datinicvenc;
    private Date datfimvenc;
    private Date datinicpgto;
    private Date datfimpgto;
    private Date datinicemiss;
    private Date datfimemiss;
    private Date datinicemissetapa;
    private Date datfimemissetapa;
    private Integer totalizar;
    private final Funcoes funcoes = new Funcoes();
    private boolean aberto;
    private List<Fornecedor> sourceFornecedor = new ArrayList<>();
    private List<Fornecedor> targetFornecedor = new ArrayList<>();
    private List<Empreendimento> sourceEmpreendimento = new ArrayList<>();
    private List<Empreendimento> targetEmpreendimento = new ArrayList<>();
    private List<CentroCusto> sourceCentroCusto = new ArrayList<>();
    private List<CentroCusto> targetCentroCusto = new ArrayList<>();
    private boolean abreEmpreendimento = true;
    private String titulo = "RELATÓRIO FINANCEIRO";
    private TituloRelatorio selectedTituloRelatorio;
    private LazyDataModel<TituloRelatorio> lazyModel;

    private String saida;
    private String nomeRelatorio;
    private String nomePDF;
    private Conecta conecta;
    private String cWhere;
    private String cOrder;
    private int nrel;
    private int nordem;
    private String cNomEmpresa = "";

    private List<String> selectedCliente;

    public RelatorioBean() throws EaoException {
        ctx = FacesContext.getCurrentInstance();

        session = (HttpSession) ctx.getExternalContext().getSession(false);
        //session.setAttribute("filtroRelatorioClassificao", selectedClientes);
        //session.setAttribute("filtroAssuntoClassificao", selectedAssuntos);
        //session.setAttribute("filtroOrder", " ORDER BY cliente.\"nom_cliente\" ASC, empreendimento.\"dsc_empreendimento\" ASC ");
        session.setAttribute("filtroStatus", "T");

        status = "Todos";

        EmpresaJpa = EmpresaEao.getInstance();
        ClienteJpa = ClienteEao.getInstance();
        FornecedorJpa = FornecedorEao.getInstance();
        assuntoEAO = AssuntoEao.getInstance();
        RelatorioFinanceiroJpa = RelatorioFinanceiroEao.getInstance();
        propostaValorJpa = PropostaValorEao.getInstance();
        propostaValorPercJpa = PropostaValorPercEao.getInstance();
        contaReceberJpa = ContaReceberEao.getInstance();
        contaPagarJpa = ContaPagarEao.getInstance();
        empreendimentoJpa = EmpreendimentoEao.getInstance();
        centroCustoJpa = CentroCustoEao.getInstance();
        tituloRelatorioJpa = TituloRelatorioEao.getInstance();

        selectedTituloRelatorio = new TituloRelatorio();
        lazyModel = new LazyTituloRelatorio(tituloRelatorioJpa);

        // PickList Empresa
        List<Empresa> sourceEmpresa = new ArrayList<>();
        List<Empresa> targetEmpresa = new ArrayList<>();

        sourceEmpresa = EmpresaJpa.getNative("Empresa", 0, EmpresaJpa.getCount("Empresa"), null, true, null, null, null);

        empresaPicks = new DualListModel<>(sourceEmpresa, targetEmpresa);

        // PickList Cliente
        List<Cliente> source = new ArrayList<>();
        List<Cliente> target = new ArrayList<>();

        //source = ClienteJpa.getNative("Cliente", 0, ClienteJpa.getCount("Cliente"), null, true, null, null, null);
        clientePicks = new DualListModel<>(source, target);

        // PickList Fornecedor
        sourceFornecedor = new ArrayList<>();
        targetFornecedor = new ArrayList<>();

        sourceFornecedor = FornecedorJpa.getNative("Fornecedor", 0, FornecedorJpa.getCount("Fornecedor"), null, true, null, null, null);
        fornecedorPicks = new DualListModel<>(sourceFornecedor, targetFornecedor);

        // PickList Empreendimento
        sourceEmpreendimento = new ArrayList<>();
        targetEmpreendimento = new ArrayList<>();

        //sourceEmpreendimento = empreendimentoJpa.getNative("Empreendimento", 0, empreendimentoJpa.getCount("Empreendimento"), null, true, null, null, " sta_empreendimento = 'A' ");
        empreendimentoPicks = new DualListModel<>(sourceEmpreendimento, targetEmpreendimento);

        // PickList Centro Custo
        sourceCentroCusto = new ArrayList<>();
        targetCentroCusto = new ArrayList<>();

        sourceCentroCusto = centroCustoJpa.getNative("CentroCusto", 0, centroCustoJpa.getCount("CentroCusto"), null, true, null, null, null);

        for (int i = 0; i < sourceCentroCusto.size(); i++) {
            CentroCusto selectedCentroCusto = sourceCentroCusto.get(i);
            selectedCentroCusto.setDscCusto(selectedCentroCusto.getDscCusto().toUpperCase().replace("CONTROLE:", "").trim());
            sourceCentroCusto.set(i, selectedCentroCusto);
        }

        centroCustoPicks = new DualListModel<>(sourceCentroCusto, targetCentroCusto);

        totalizar = 1;

        selectedCliente = new ArrayList<>();
        /*
         selectedCliente.add("A");
         selectedCliente.add("I");
         selectedCliente.add("P");
         */
    }

    public Cliente[] getSelectedClientes() {
        return selectedClientes;
    }

    public void setSelectedClientes(Cliente[] selectedClientes) {
        this.selectedClientes = selectedClientes;
    }

    public List getClienteList() {
        return clienteList;
    }

    public LazySelectedClassificao getLazyCliente() {
        return lazyCliente;
    }

    public void setLazyCliente(LazySelectedClassificao lazyCliente) {
        this.lazyCliente = lazyCliente;
    }

    public void setClienteList(List<Cliente> clienteList) {
        this.clienteList = clienteList;
    }

    public List<Assunto> getAssuntoList() {
        return assuntoList;
    }

    public void setAssuntoList(List<Assunto> assuntoList) {
        this.assuntoList = assuntoList;
    }

    public LazySelectedAssunto getLazyAssunto() {
        return lazyAssunto;
    }

    public void setLazyAssunto(LazySelectedAssunto lazyAssunto) {
        this.lazyAssunto = lazyAssunto;
    }

    public Assunto[] getSelectedAssuntos() {
        return selectedAssuntos;
    }

    public void setSelectedAssuntos(Assunto[] selectedAssuntos) {
        this.selectedAssuntos = selectedAssuntos;
    }

    public void gerarRelatorio(ActionEvent actionEvent) {
        msg = null;
        try {
            clienteList = ClienteJpa.getNative("Cliente", 0, ClienteJpa.getCount("Cliente"), null, true, null, null, null);

            lazyCliente = new LazySelectedClassificao(clienteList);

            assuntoList = assuntoEAO.getNative("Assunto", 0, assuntoEAO.getCount("Assunto"), null, true, null, null, null);
            lazyAssunto = new LazySelectedAssunto(assuntoList);
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Carga efetuada com Sucesso!", " ");
        } catch (Exception ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Carregar os Dados!", " ");
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void imprimirRelatorio(ActionEvent actionEvent) {
        msg = null;
        try {
            session.setAttribute("filtroRelatorioClassificao", this.selectedClientes);
            session.setAttribute("filtroAssuntoClassificao", this.selectedAssuntos);
            session.setAttribute("filtroOrder", " ORDER BY cliente.\"nom_cliente\" ASC, empreendimento.\"dsc_empreendimento\" ASC ");

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada do Relatório efetuada com Sucesso!", " ");
        } catch (Exception ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", " ");
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public String alterarStatusSinal(String cStatus) {
        session.setAttribute("filtroStatus", cStatus);

        switch (cStatus) {
            case "T":
                this.status = "Todos";
                break;
            case "A":
                this.status = "Em Andamento";
                break;
            case "F":
                this.status = "Finalizado";
                break;
            case "N":
                this.status = "Não Contratado";
                break;
        }

        return null;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public List<String> getSelectedTipo() {
        return selectedTipo;
    }

    public void setSelectedTipo(List<String> selectedTipo) {

        this.selectedTipo = selectedTipo;
    }

    public void handleClienteChange() {
        boolean lPassaR = false;
        boolean lPassaP = false;

        if (selectedTipo == null) {
            this.lcliente = false;
            this.lfornecedor = false;
        } else {
            if (selectedTipo.isEmpty()) {
                this.lcliente = false;
                this.lfornecedor = false;
            } else {
                for (String cTipo : selectedTipo) {
                    switch (cTipo) {
                        case "O":
                            this.lcliente = true;
                            lPassaR = true;
                            break;
                        case "R":
                            this.lcliente = true;
                            lPassaR = true;
                            break;
                        case "P":
                            this.lfornecedor = true;
                            lPassaP = true;
                            break;
                    }
                    if (!lPassaR) {
                        this.lcliente = false;
                    } else if (!lPassaP) {
                        this.lfornecedor = false;
                    }

                }
            }
        }
    }

    public void onTransfer(TransferEvent event) {
        for (Object item : event.getItems()) {
            if (!clienteList.contains(item)) {
                clienteList.add((Cliente) item);
            }
        }
        String cFiltro = "";
        try {
            cFiltro += " empreendimento.id_cliente in (";
            for (Cliente clienteList1 : clienteList) {
                cFiltro += clienteList1.getIdCliente() + ",";
            }
            cFiltro += "0) ";

            // PickList Empreendimento
            sourceEmpreendimento = new ArrayList<>();
            targetEmpreendimento = new ArrayList<>();

            sourceEmpreendimento = empreendimentoJpa.getNative("Empreendimento", 0, empreendimentoJpa.getCount("Empreendimento"), null, true, null, null, cFiltro);
            empreendimentoPicks = new DualListModel<>(sourceEmpreendimento, targetEmpreendimento);
        } catch (Exception ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            this.abreEmpreendimento = false;
        }

    }

    public DualListModel<Cliente> getClientePicks() {
        return clientePicks;
    }

    public void setClientePicks(DualListModel<Cliente> clientePicks) {
        this.clientePicks = clientePicks;
    }

    public boolean isLcliente() {
        return lcliente;
    }

    public void setLcliente(boolean lcliente) {
        this.lcliente = lcliente;
    }

    public boolean isLfornecedor() {
        return lfornecedor;
    }

    public void setLfornecedor(boolean lfornecedor) {
        this.lfornecedor = lfornecedor;
    }

    public List<String> getSelectedTipoDocumento() {
        return selectedTipoDocumento;
    }

    public void setSelectedTipoDocumento(List<String> selectedTipoDocumento) {
        this.selectedTipoDocumento = selectedTipoDocumento;
    }

    public DualListModel<Fornecedor> getFornecedorPicks() {
        return fornecedorPicks;
    }

    public void setFornecedorPicks(DualListModel<Fornecedor> fornecedorPicks) {
        this.fornecedorPicks = fornecedorPicks;
    }

    public Date getDatinicvenc() {
        return datinicvenc;
    }

    public void setDatinicvenc(Date datinicvenc) {
        this.datinicvenc = datinicvenc;
    }

    public Date getDatfimvenc() {
        return datfimvenc;
    }

    public void setDatfimvenc(Date datfimvenc) {
        this.datfimvenc = datfimvenc;
    }

    public Date getDatinicpgto() {
        return datinicpgto;
    }

    public void setDatinicpgto(Date datinicpgto) {
        this.datinicpgto = datinicpgto;
    }

    public Date getDatfimpgto() {
        return datfimpgto;
    }

    public void setDatfimpgto(Date datfimpgto) {
        this.datfimpgto = datfimpgto;
    }

    public Integer getTotalizar() {
        return totalizar;
    }

    public void setTotalizar(Integer totalizar) {
        this.totalizar = totalizar;
    }

    public void gerarRelatorioFinanceiro(ActionEvent actionEvent) throws EaoException {
        msg = null;
        boolean lPassa = true;
        boolean lPassaCliO = false;
        boolean lPassaCliR = false;
        boolean lPassaFor = false;
        boolean lPassaDatVcto = true;
        boolean lPassaDatPagto = true;
        boolean lOsCancelada = false;
        boolean lEtapaCancelada = false;
        boolean lPassaOs = false;
        String cFiltro = "";
        String cTipDoc = "";
        String cTipDoc2 = "";
        String cFiltroEmpresa = "";
        String cFiltroPerc = "";
        Integer nTipDoc = 0;
        BigDecimal nZero = new BigDecimal(0);
        int nRelatorio = 0;

        if (this.selectedTituloRelatorio.getDscTitulo().isEmpty()) {
            this.selectedTituloRelatorio.setDscTitulo("RELATÓRIO FINANCEIRO");
        }
        session.setAttribute("titulo", this.selectedTituloRelatorio.getDscTitulo());

        Usuario usuario = (Usuario) session.getAttribute("usuarioAutenticado");

        try {
            cFiltro = "";
            if (empresaPicks.getTarget().isEmpty()) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar Empresa!", " ");
            }

            //FILTRA STATUS DAS O.S's
            if (selectedStatus.isEmpty()) {
                lPassa = false;
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar Status da Ordem de Serviço!", " ");
            } else {
                cFiltro += " proposta.tip_status in (";

                for (String selectedStatus1 : selectedStatus) {
                    switch (selectedStatus1) {
                        case "8":
                            cFiltro += "'8',";
                            break;
                        case "0":
                            cFiltro += "'0',";
                            break;
                        case "A":
                            cFiltro += "'A',";
                            break;
                    }
                }
                cFiltro += "'X') ";
            }
            if (lPassa) {
                if (this.datinicemiss != null && this.datfimemiss != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimemiss, this.datinicemiss)) {
                        lPassa = true;
                        cFiltro += " and proposta.dat_os BETWEEN '".concat(funcoes.ConverteDateString(this.datinicemiss)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimemiss)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão O.S. Incorreta!", "");
                    }
                } else if ((this.datinicemiss == null && this.datfimemiss != null) || (this.datinicemiss != null && this.datfimemiss == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão O.S. Incorreta!", "");
                }
            }

            if (lPassa) {
                if (this.datinicemissetapa != null && this.datfimemissetapa != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimemissetapa, this.datinicemissetapa)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPerc += " proposta_valor_perc.dat_emissao BETWEEN '".concat(funcoes.ConverteDateString(this.datinicemissetapa)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimemissetapa)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão Etapa Incorreta!", "");
                    }
                } else if ((this.datinicemissetapa == null && this.datfimemissetapa != null) || (this.datinicemissetapa != null && this.datfimemissetapa == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Emissão Etapa Incorreta!", "");
                }
            }

            String cFiltroPercVecto = "";
            if (lPassa) {
                if (this.datinicvenc != null && this.datfimvenc != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimvenc, this.datinicvenc)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPercVecto += " (proposta_valor_perc.dat_venc_nota BETWEEN '".concat(funcoes.ConverteDateString(this.datinicvenc)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimvenc)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Vencimento Incorreta!", "");
                    }
                } else if ((this.datinicvenc == null && this.datfimvenc != null) || (this.datinicvenc != null && this.datfimvenc == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Vencimento Incorreta!", "");
                }
            }

            if (lPassa) {
                if (this.datinicpgto != null && this.datfimpgto != null) {
                    if (funcoes.compareDatesByCompareTo(this.datfimpgto, this.datinicpgto)) {
                        lPassa = true;
                        if (!cFiltroPerc.isEmpty()) {
                            cFiltroPerc += " and ";
                        }
                        cFiltroPerc += " proposta_valor_perc.dat_pagamento BETWEEN '".concat(funcoes.ConverteDateString(this.datinicpgto)).concat("' AND '").concat(funcoes.ConverteDateString(this.datfimpgto)).concat("' ");
                    } else {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Pagamento Incorreta!", "");
                    }
                } else if ((this.datinicpgto == null && this.datfimpgto != null) || (this.datinicpgto != null && this.datfimpgto == null)) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Faixa de Pagamento Incorreta!", "");
                }
            }

            if (lPassa) {
                int nEntra = 0;
                for (String selectedTipo1 : selectedTipo) {
                    nEntra = 1;
                    switch (selectedTipo1) {
                        case "O":
                            lPassaCliO = true;
                            break;
                        case "R":
                            lPassaCliR = true;
                            break;
                        case "P":
                            lPassaFor = true;
                            break;
                    }
                }
                if (nEntra == 0) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar Tipo de Conta!", " ");
                }
            }

            if (lPassa) {
                if (lPassaCliO || lPassaCliR) {
                    if (clientePicks.getTarget().isEmpty()) {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar os Clientes!", " ");
                    }
                }
            }

            if (lPassa) {
                if (lPassaFor) {
                    if (fornecedorPicks.getTarget().isEmpty()) {
                        lPassa = false;
                        msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar os Fornecedores!", " ");
                    }
                }
            }

            if (lPassa) {
                if (selectedTipoDocumento.isEmpty()) {
                    lPassa = false;
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Obrigatório selecionar Tipo de Documento!", " ");
                }
            }

            if (lPassa) {
                RelatorioFinanceiroJpa.executeUpdate("delete from relatorio_financeiro where id_usuario = ".concat(usuario.getIdUsuario().toString()));

                if (!cFiltroPerc.isEmpty()) {
                    cFiltroPerc += " and ord_status in (";
                } else {
                    cFiltroPerc = " ord_status in (";
                }
                boolean lVecto = false;
                for (String selectedTipoDocumento1 : selectedTipoDocumento) {
                    switch (selectedTipoDocumento1) {
                        // VERIFICA SE TEM ABERTO
                        case "A":
                            cFiltroPerc += "'A',";
                            lVecto = true;
                            // VERIFICA ORDEM DE SERVICO A FATURAR
                            // VERIFICA CONTA A RECEBER ABERTO
                            if (lPassaCliO || lPassaCliR) {
                                cTipDoc = "A";
                                nTipDoc = 1;
                            }
                            // VERIFICA CONTA A PAGAR ABERTO
                            if (lPassaFor) {
                                cTipDoc = "A";
                                nTipDoc = 1;
                            }
                            break;
                        case "F":
                            cFiltroPerc += "'F',";
                            // VERIFICA ORDEM DE SERVICO FATURADO NAO PAGO
                            if (lPassaCliO) {
                                cTipDoc = "A";
                                nTipDoc = 1;
                            }
                            break;
                        case "B":
                            // VERIFICA ORDEM DE SERVICO BAIXADO
                            // VERIFICA CONTA A RECEBER BAIXADO
                            if (lPassaCliO || lPassaCliR) {
                                cTipDoc = "B";
                                nTipDoc += 2;
                            }
                            // VERIFICA CONTA A PAGAR BAIXADO
                            if (lPassaFor) {
                                cTipDoc = "B";
                                nTipDoc += 2;
                            }
                            break;
                        // VERIFICA SE TEM BAIXADO
                        case "P":
                            cFiltroPerc += "'P',";
                            // VERIFICA ORDEM DE SERVICO BAIXADO
                            // VERIFICA CONTA A RECEBER BAIXADO
                            if (lPassaCliO) {
                                cTipDoc = "B";
                                nTipDoc += 2;
                            }
                            break;
                        case "C":
                            cFiltroPerc += "'C',";
                            // VERIFICA SE VAI IMPRIMIR O.S. CANCELADA
                            lOsCancelada = true;
                            break;
                        case "E":
                            // VERIFICA SE VAI IMPRIMIR ETAPA CANCELADA
                            lEtapaCancelada = true;
                            break;

                    }
                }
                cFiltroPerc += "'X') ";
                if (lVecto && (!cFiltroPercVecto.isEmpty())) {
                    cFiltroPerc += " and ".concat(cFiltroPercVecto).concat(" or dat_venc_nota is null ) ");
                } else if (!cFiltroPercVecto.isEmpty()) {
                    cFiltroPerc += " and ".concat(cFiltroPercVecto).concat(") ");
                }
                if (nTipDoc >= 3) {
                    cTipDoc = "X";
                }

                // FILTRA OS CLIENTES
                if (lPassaCliO || lPassaCliR) {
                    if (!cFiltro.isEmpty()) {
                        cFiltro += " and ";
                    }
                    cFiltro += " cliente.id_cliente in (";
                    for (Cliente target : clientePicks.getTarget()) {
                        cFiltro += target.getIdCliente() + ",";
                    }
                    cFiltro += "0) ";
                }

                // FILTRA AS EMPRESAS
                cNomEmpresa = "";
                cFiltroEmpresa += " empresa.id_empresa in (";
                for (Empresa target : empresaPicks.getTarget()) {
                    cFiltroEmpresa += target.getIdEmpresa() + ",";
                    cNomEmpresa += target.getNomEmpresa().concat(" - ");
                }
                session.setAttribute("empresa", cNomEmpresa);
                cFiltroEmpresa += "0) ";

                // INCORPORA AS EMPRESAS
                if (!cFiltro.isEmpty()) {
                    cFiltro += " and ".concat(cFiltroEmpresa);
                } else {
                    cFiltro += cFiltroEmpresa;
                }

                // INCORPORA EMPREENDIMENTOS
                if (!centroCustoPicks.getTarget().isEmpty()) {
                    if (!cFiltro.isEmpty()) {
                        cFiltro += " and ";
                    }
                    cFiltro += " centro_custo.id_custo in (";
                    for (CentroCusto target : centroCustoPicks.getTarget()) {
                        cFiltro += target.getIdCusto() + ",";
                    }
                    cFiltro += "0) ";
                }

                // CARREGA ORDEM DE SERVICO
                if (lPassaCliO) {
                    String cFiltroPercTemp = "";
                    List<PropostaValor> ordemServicoList = propostaValorJpa.getNative("PropostaValor", 0, propostaValorJpa.getCount("PropostaValor"), null, true, null, null, cFiltro);
                    for (PropostaValor selectedPropostaValor : ordemServicoList) {

                        String cDscDocumento = selectedPropostaValor.getDscEtapa().concat(" - ").concat(selectedPropostaValor.getDscAssunto());
                        String cFantasia = selectedPropostaValor.getIdProposta().getIdEmpresa().getNomEmpresa() + " - " + selectedPropostaValor.getIdProposta().getIdCliente().getNomCliente();
                        Date dDatdoc = selectedPropostaValor.getIdProposta().getDatProposta();

                        cFiltroPercTemp = " proposta_valor_perc.id_proposta_valor = ".concat(selectedPropostaValor.getIdPropostaValor().toString()).concat(" and ");
                        cFiltroPercTemp += cFiltroPerc;
                        List<PropostaValorPerc> ordemServicoPercList = propostaValorPercJpa.getNative("PropostaValorPerc", 0, propostaValorPercJpa.getCount("PropostaValorPerc"), null, true, null, null, cFiltroPercTemp);

                        for (PropostaValorPerc selectedPropostaValorPerc : ordemServicoPercList) {
                            // CONCATENA EVENTO ATE 200
                            String cDscDocumento2 = cDscDocumento + " " + selectedPropostaValorPerc.getDscPerc();
                            if (cDscDocumento2.length() > 200) {
                                cDscDocumento2 = cDscDocumento2.substring(0, 198);
                            }
                            RelatorioFinanceiro selectedRelatorioFinanceiro = new RelatorioFinanceiro();

                            String cCor = "";
                            String cCorLetra = "#FFFFFF";
                            if (selectedPropostaValor.getIdProposta().getCorStatus() == null) {
                                cCor = "#00FF00";
                                cCorLetra = "#000000";
                            } else if (selectedPropostaValor.getIdProposta().getCorStatus().equals("lawngreen")) {
                                cCor = "#00FF00";
                                cCorLetra = "#000000";
                            } else if (selectedPropostaValor.getIdProposta().getCorStatus().equals("red")) {
                                cCor = "#FF0000";
                            } else if (selectedPropostaValor.getIdProposta().getCorStatus().equals("blue")) {
                                cCor = "#0000FF";
                            }

                            selectedRelatorioFinanceiro.setDatPagtoFim(this.datfimpgto);
                            selectedRelatorioFinanceiro.setDatPagtoInicio(this.datinicpgto);
                            selectedRelatorioFinanceiro.setDatVectoInicio(this.datinicvenc);
                            selectedRelatorioFinanceiro.setDatVenctoFim(this.datfimvenc);
                            selectedRelatorioFinanceiro.setDscDocumento(cDscDocumento2);
                            selectedRelatorioFinanceiro.setDscFantasia(cFantasia);
                            selectedRelatorioFinanceiro.setIdCliente(selectedPropostaValor.getIdProposta().getIdCliente());
                            selectedRelatorioFinanceiro.setIdCusto(selectedPropostaValor.getIdProposta().getIdEmpreendimento().getIdCusto());
                            selectedRelatorioFinanceiro.setIdFornecedor(null);
                            selectedRelatorioFinanceiro.setTipConta("O");
                            selectedRelatorioFinanceiro.setTipDocumento(selectedPropostaValorPerc.getOrdStatus());
                            selectedRelatorioFinanceiro.setTipTotal(totalizar);
                            selectedRelatorioFinanceiro.setVlrImposto(selectedPropostaValorPerc.getVlrImposto());
                            selectedRelatorioFinanceiro.setVlrDocumento(selectedPropostaValorPerc.getVlrProposta());
                            selectedRelatorioFinanceiro.setVlrRecebido(selectedPropostaValorPerc.getVlrPago());
                            selectedRelatorioFinanceiro.setVlrPago(nZero);
                            selectedRelatorioFinanceiro.setDatPagto(selectedPropostaValorPerc.getDatPagamento());
                            selectedRelatorioFinanceiro.setDatVencto(selectedPropostaValorPerc.getDatVencNota());
                            selectedRelatorioFinanceiro.setIdEmpreendimento(selectedPropostaValor.getIdProposta().getIdEmpreendimento());
                            selectedRelatorioFinanceiro.setDatDoc(dDatdoc);
                            selectedRelatorioFinanceiro.setDatEmissao(selectedPropostaValorPerc.getDatEmissao());
                            selectedRelatorioFinanceiro.setNumDocumento(selectedPropostaValorPerc.getDscNfe());
                            selectedRelatorioFinanceiro.setNumOs(selectedPropostaValor.getIdProposta().getNumOs());
                            selectedRelatorioFinanceiro.setIdUsuario(usuario);
                            selectedRelatorioFinanceiro.setCorStatus(cCor);
                            selectedRelatorioFinanceiro.setCorLetra(cCorLetra);
                            selectedRelatorioFinanceiro.setVlrJuros(selectedPropostaValorPerc.getVlrJuros());
                            selectedRelatorioFinanceiro.setVlrMulta(selectedPropostaValorPerc.getVlrMulta());

                            RelatorioFinanceiroJpa.create(selectedRelatorioFinanceiro);
                            nRelatorio++;
                        }
                    }
                }
                //CARREGA CONTAS A RECEBER
                if (lPassaCliR) {
                    List<ContaReceber> contaReceberList = contaReceberJpa.getNative("ContaReceber", 0, contaReceberJpa.getCount("ContaReceber"), null, true, null, null, cFiltro);
                    for (ContaReceber selectedContaReceber : contaReceberList) {
                        String cDscDocumento = selectedContaReceber.getDscReceber();
                        String cFantasia = selectedContaReceber.getIdCliente().getNomCliente();
                        String cNumDocumento = selectedContaReceber.getNumDocumento();
                        String cNumOs = selectedContaReceber.getNumOs();
                        Date dDatDoc = selectedContaReceber.getDatEmissao();

                        for (int j = 0; j < selectedContaReceber.getContaReceberParcelaList().size(); j++) {
                            lPassaDatPagto = true;
                            lPassaDatVcto = true;

                            ContaReceberParcela selectedContaReceberParcela = selectedContaReceber.getContaReceberParcelaList().get(j);

                            // VERIFICA FAIXA DATA DE PAGAMENTO
                            if (this.datinicpgto != null) {
                                if (selectedContaReceberParcela.getDatPagto() != null) {
                                    lPassaDatPagto = selectedContaReceberParcela.getDatPagto().compareTo(this.datinicpgto) >= 0 && selectedContaReceberParcela.getDatPagto().compareTo(this.datfimpgto) <= 0;
                                }
                            } else {
                                lPassaDatVcto = false;
                            }
                            // VERIFICA FAIXA DATA VENCIMENTO
                            if (this.datinicvenc != null) {
                                if (selectedContaReceberParcela.getDatVcto() != null) {
                                    lPassaDatVcto = selectedContaReceberParcela.getDatVcto().compareTo(this.datinicvenc) >= 0 && selectedContaReceberParcela.getDatVcto().compareTo(this.datfimvenc) <= 0;
                                }
                            } else {
                                lPassaDatVcto = false;
                            }
                            // VERIFICA SE A ETAPA FAZ PARTE DO TIPO DE DOCUMENTO
                            // PRIMEIRO VERIFICA SE E TOTAL GERAL
                            lPassaDatPagto = selectedTipoDocumento.contains("G");
                            // SE FALSE VERIFICA SE FAZ PARTE DO FILTRO
                            if (!lPassaDatPagto) {
                                lPassaDatPagto = selectedTipoDocumento.contains(selectedContaReceberParcela.getTipStatus());
                            }

                            if (lPassaDatPagto || lPassaDatVcto) {
                                RelatorioFinanceiro selectedRelatorioFinanceiro = new RelatorioFinanceiro();

                                selectedRelatorioFinanceiro.setDatPagtoFim(this.datfimpgto);
                                selectedRelatorioFinanceiro.setDatPagtoInicio(this.datinicpgto);
                                selectedRelatorioFinanceiro.setDatVectoInicio(this.datinicvenc);
                                selectedRelatorioFinanceiro.setDatVenctoFim(this.datfimvenc);
                                selectedRelatorioFinanceiro.setDscDocumento(cDscDocumento);
                                selectedRelatorioFinanceiro.setDscFantasia(cFantasia);
                                selectedRelatorioFinanceiro.setIdCliente(selectedContaReceberParcela.getIdReceber().getIdCliente());
                                selectedRelatorioFinanceiro.setIdCusto(selectedContaReceberParcela.getIdReceber().getIdCusto());
                                selectedRelatorioFinanceiro.setIdFornecedor(null);
                                selectedRelatorioFinanceiro.setTipConta("R");
                                selectedRelatorioFinanceiro.setTipDocumento(selectedContaReceberParcela.getTipStatus());
                                selectedRelatorioFinanceiro.setTipTotal(totalizar);
                                selectedRelatorioFinanceiro.setVlrDocumento(selectedContaReceberParcela.getVlrParcela());
                                selectedRelatorioFinanceiro.setVlrRecebido(selectedContaReceberParcela.getVlrPago());
                                selectedRelatorioFinanceiro.setVlrPago(nZero);
                                selectedRelatorioFinanceiro.setDatPagto(selectedContaReceberParcela.getDatPagto());
                                selectedRelatorioFinanceiro.setDatVencto(selectedContaReceberParcela.getDatVcto());
                                selectedRelatorioFinanceiro.setIdEmpreendimento(selectedContaReceber.getIdEmpreendimento());
                                selectedRelatorioFinanceiro.setDatDoc(dDatDoc);
                                selectedRelatorioFinanceiro.setDatEmissao(dDatDoc);
                                selectedRelatorioFinanceiro.setNumDocumento(cNumDocumento);
                                selectedRelatorioFinanceiro.setNumOs(cNumOs);
                                selectedRelatorioFinanceiro.setVlrImposto(selectedContaReceberParcela.getVlrImposto());
                                selectedRelatorioFinanceiro.setIdUsuario(usuario);

                                RelatorioFinanceiroJpa.create(selectedRelatorioFinanceiro);
                                nRelatorio++;
                            }
                        }
                    }
                }
                //CARREGA CONTAS A PAGAR
                // FILTRAS OS FORNECEDORES
                if (lPassaFor) {
                    cFiltro = "";
                    if (!cFiltro.isEmpty()) {
                        cFiltro += " and ";
                    }
                    cFiltro += " fornecedor.id_fornecedor in (";
                    for (Fornecedor target : fornecedorPicks.getTarget()) {
                        cFiltro += target.getIdFornecedor() + ",";
                    }
                    cFiltro += "0) ";

                    // INCORPORA AS EMPRESAS
                    if (!cFiltro.isEmpty()) {
                        cFiltro += " and ".concat(cFiltroEmpresa);
                    } else {
                        cFiltro += cFiltroEmpresa;
                    }

                    // INCORPORA EMPREENDIMENTOS
                    if (!centroCustoPicks.getTarget().isEmpty()) {
                        if (!cFiltro.isEmpty()) {
                            cFiltro += " and ";
                        }
                        cFiltro += " centro_custo.id_custo in (";
                        for (CentroCusto target : centroCustoPicks.getTarget()) {
                            cFiltro += target.getIdCusto() + ",";
                        }
                        cFiltro += "0) ";
                    }

                    List<ContaPagar> contaPagarList = contaPagarJpa.getNative("ContaPagar", 0, contaPagarJpa.getCount("ContaPagar"), null, true, null, null, cFiltro);
                    for (ContaPagar selectedContaPagar : contaPagarList) {
                        Empreendimento selectedEmprendimento = new Empreendimento();
                        String cDscDocumento = selectedContaPagar.getDscPagar();
                        String cFantasia = selectedContaPagar.getIdFornecedor().getNomFornecedor();
                        String cNumDocumento = selectedContaPagar.getNumDocumento();
                        String cNumOs = selectedContaPagar.getNumOs();
                        Date dDatDoc = selectedContaPagar.getDatEmissao();

                        if (selectedContaPagar.getIdFornecedor().getIdFornecedor() == 0) {
                            Integer nIdCusto = selectedContaPagar.getIdCusto().getIdCusto();
                            cFiltro = " empreendimento.id_custo = " + nIdCusto;
                            List<Empreendimento> empreendimentoList = empreendimentoJpa.getNative("Empreendimento", 0, empreendimentoJpa.getCount("Empreendimento"), null, true, null, null, cFiltro);

                            if (!empreendimentoList.isEmpty()) {
                                selectedEmprendimento = empreendimentoList.get(0);
                                cFantasia = selectedEmprendimento.getIdCliente().getNomCliente();
                            }
                        }

                        for (int j = 0; j < selectedContaPagar.getContaPagarParcelaList().size(); j++) {
                            lPassaDatPagto = true;
                            ContaPagarParcela selectedContaPagarParcela = selectedContaPagar.getContaPagarParcelaList().get(j);

                            // VERIFICA FAIXA DATA DE PAGAMENTO
                            if (this.datinicpgto != null) {
                                if (selectedContaPagarParcela.getDatPagto() != null) {
                                    lPassaDatPagto = selectedContaPagarParcela.getDatPagto().compareTo(this.datinicpgto) >= 0 && selectedContaPagarParcela.getDatPagto().compareTo(this.datfimpgto) <= 0;
                                }
                            } else {
                                lPassaDatPagto = false;
                            }
                            // VERIFICA FAIXA DATA VENCIMENTO
                            if (this.datinicvenc != null) {
                                if (selectedContaPagarParcela.getDatVcto() != null) {
                                    lPassaDatVcto = selectedContaPagarParcela.getDatVcto().compareTo(this.datinicvenc) >= 0 && selectedContaPagarParcela.getDatVcto().compareTo(this.datfimvenc) <= 0;
                                }
                            } else {
                                lPassaDatVcto = false;
                            }

                            // VERIFICA SE A ETAPA FAZ PARTE DO TIPO DE DOCUMENTO
                            // PRIMEIRO VERIFICA SE E TOTAL GERAL
                            lPassaDatPagto = selectedTipoDocumento.contains("G");
                            // SE FALSE VERIFICA SE FAZ PARTE DO FILTRO
                            if (!lPassaDatPagto) {
                                lPassaDatPagto = selectedTipoDocumento.contains(selectedContaPagarParcela.getTipStatus());
                            }

                            if (lPassaDatPagto || lPassaDatVcto) {
                                RelatorioFinanceiro selectedRelatorioFinanceiro = new RelatorioFinanceiro();

                                selectedRelatorioFinanceiro.setDatPagtoFim(this.datfimpgto);
                                selectedRelatorioFinanceiro.setDatPagtoInicio(this.datinicpgto);
                                selectedRelatorioFinanceiro.setDatVectoInicio(this.datinicvenc);
                                selectedRelatorioFinanceiro.setDatVenctoFim(this.datfimvenc);
                                selectedRelatorioFinanceiro.setDscDocumento(cDscDocumento);
                                selectedRelatorioFinanceiro.setDscFantasia(cFantasia);
                                selectedRelatorioFinanceiro.setTipConta("P");
                                selectedRelatorioFinanceiro.setTipDocumento(selectedContaPagarParcela.getTipStatus());
                                selectedRelatorioFinanceiro.setTipTotal(totalizar);
                                selectedRelatorioFinanceiro.setVlrDocumento(selectedContaPagarParcela.getVlrParcela());
                                selectedRelatorioFinanceiro.setVlrRecebido(nZero);
                                selectedRelatorioFinanceiro.setVlrPago(selectedContaPagarParcela.getVlrPago());
                                selectedRelatorioFinanceiro.setDatPagto(selectedContaPagarParcela.getDatPagto());
                                selectedRelatorioFinanceiro.setDatVencto(selectedContaPagarParcela.getDatVcto());
                                selectedRelatorioFinanceiro.setDatDoc(dDatDoc);
                                selectedRelatorioFinanceiro.setDatEmissao(dDatDoc);
                                selectedRelatorioFinanceiro.setNumDocumento(cNumDocumento);
                                selectedRelatorioFinanceiro.setIdCliente(selectedEmprendimento.getIdCliente());
                                selectedRelatorioFinanceiro.setIdCusto(selectedContaPagarParcela.getIdPagar().getIdCusto());
                                selectedRelatorioFinanceiro.setIdFornecedor(selectedContaPagarParcela.getIdPagar().getIdFornecedor());
                                selectedRelatorioFinanceiro.setNumOs(cNumOs);
                                selectedRelatorioFinanceiro.setVlrImposto(selectedContaPagarParcela.getVlrImposto());
                                selectedRelatorioFinanceiro.setIdUsuario(usuario);

                                if (selectedEmprendimento.getIdEmpreendimento() != null) {
                                    selectedRelatorioFinanceiro.setIdEmpreendimento(selectedEmprendimento);
                                }

                                RelatorioFinanceiroJpa.create(selectedRelatorioFinanceiro);
                                nRelatorio++;
                            }
                        }
                    }
                }
                if (nRelatorio > 0) {
                    msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Geração do Relatório efetuada com Sucesso!", " ");
                } else {
                    msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... NENHUM REGISTRO RETORNADO, CONFORME O FILTRO ESCOLHIDO ...", " ");
                }
            }
        } catch (Exception ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Gerar o Relatório!", " ");
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public boolean isAberto() {
        return aberto;
    }

    public void setAberto(boolean aberto) {
        this.aberto = aberto;
    }

    public DualListModel<Empresa> getEmpresaPicks() {
        return empresaPicks;
    }

    public void setEmpresaPicks(DualListModel<Empresa> empresaPicks) {
        this.empresaPicks = empresaPicks;
    }

    public DualListModel<Empreendimento> getEmpreendimentoPicks() {
        return empreendimentoPicks;
    }

    public void setEmpreendimentoPicks(DualListModel<Empreendimento> empreendimentoPicks) {
        this.empreendimentoPicks = empreendimentoPicks;
    }

    public boolean isAbreEmpreendimento() {
        return abreEmpreendimento;
    }

    public void setAbreEmpreendimento(boolean abreEmpreendimento) {
        this.abreEmpreendimento = abreEmpreendimento;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public DualListModel<CentroCusto> getCentroCustoPicks() {
        return centroCustoPicks;
    }

    public void setCentroCustoPicks(DualListModel<CentroCusto> centroCustoPicks) {
        this.centroCustoPicks = centroCustoPicks;
    }

    public List<TituloRelatorio> completeTitulo(String query) {
        List<TituloRelatorio> tituloList = new ArrayList<>();
        Map<String, Object> filters = new HashMap<>();
        try {
            if (query == null) {
                query = "";
            }

            filters.put("dscTitulo", query);
            tituloList = tituloRelatorioJpa.getNative("TituloRelatorio", 0, EmpresaJpa.getCount("TituloRelatorio"), null, true, filters, null, null);
            if (tituloList == null) {
                tituloList = new ArrayList<>();

            }
        } catch (Exception ex) {
            Logger.getLogger(RelatorioBean.class
                    .getName()).log(Level.SEVERE, null, ex);
        }
        return tituloList;
    }

    public TituloRelatorio getSelectedTituloRelatorio() {
        if (selectedTituloRelatorio.getDscTitulo() == null) {
            selectedTituloRelatorio.setDscTitulo("RELATÓRIO FINANCEIRO");
        }
        return selectedTituloRelatorio;
    }

    public void setSelectedTituloRelatorio(TituloRelatorio selectedTituloRelatorio) {
        this.selectedTituloRelatorio = selectedTituloRelatorio;
    }

    public LazyDataModel<TituloRelatorio> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<TituloRelatorio> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public void incluirTitulo(ActionEvent actionEvent) {
        msg = null;
        try {
            if (this.titulo.isEmpty()) {
                this.selectedTituloRelatorio.setDscTitulo("RELATÓRIO FINANCEIRO");
            }
            this.selectedTituloRelatorio.setIdTitulo(null);
            tituloRelatorioJpa.create(selectedTituloRelatorio);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Título do Relatório Inserido com Sucesso", this.selectedTituloRelatorio.getDscTitulo());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir Título do Relatório", this.selectedTituloRelatorio.getDscTitulo());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterarTitulo(ActionEvent actionEvent) {
        msg = null;
        try {
            if (this.titulo.isEmpty()) {
                this.selectedTituloRelatorio.setDscTitulo("RELATÓRIO FINANCEIRO");
            }

            tituloRelatorioJpa.edit(selectedTituloRelatorio);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Título do Relatório Alterado com Sucesso", this.selectedTituloRelatorio.getDscTitulo());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar Título do Relatório", this.selectedTituloRelatorio.getDscTitulo());
        } finally {
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluirTitulo(ActionEvent actionEvent) {
        msg = null;
        try {
            tituloRelatorioJpa.destroy(selectedTituloRelatorio);

            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Título do Relatório Excluido com Sucesso", this.selectedTituloRelatorio.getDscTitulo());

        } catch (Exception e) {
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir Título do Relatório", this.selectedTituloRelatorio.getDscTitulo());
        } finally {
            selectedTituloRelatorio = new TituloRelatorio();
            this.selectedTituloRelatorio.setDscTitulo("RELATÓRIO FINANCEIRO");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public List<String> getSelectedStatus() {
        return selectedStatus;
    }

    public void setSelectedStatus(List<String> selectedStatus) {
        this.selectedStatus = selectedStatus;
    }

    public Date getDatinicemiss() {
        return datinicemiss;
    }

    public void setDatinicemiss(Date datinicemiss) {
        this.datinicemiss = datinicemiss;
    }

    public Date getDatfimemiss() {
        return datfimemiss;
    }

    public void setDatfimemiss(Date datfimemiss) {
        this.datfimemiss = datfimemiss;
    }

    public Date getDatinicemissetapa() {
        return datinicemissetapa;
    }

    public void setDatinicemissetapa(Date datinicemissetapa) {
        this.datinicemissetapa = datinicemissetapa;
    }

    public Date getDatfimemissetapa() {
        return datfimemissetapa;
    }

    public void setDatfimemissetapa(Date datfimemissetapa) {
        this.datfimemissetapa = datfimemissetapa;
    }

    public void geraRelatorio(int nRel) {
        this.cWhere = "";
        this.cOrder = "";
        msg = null;
        this.conecta = new Conecta();
        boolean lPassa = false;
        session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

        Usuario usuario = (Usuario) session.getAttribute("usuarioAutenticado");
        String usuarioTime = usuario.getUsrName();

        try {
            Map<String, Object> parametros = new HashMap<>();

            if (nRel == 1) {
                session.setAttribute("tipRel", "pagarreceber");
                this.nomeRelatorio = "relatorio_financeiro.jasper";
                this.nomePDF = "relatorio_financeiro_".concat(usuarioTime).concat(".pdf");

                cWhere = "";
                cOrder = "";

                parametros.put("PAR_EMPRESA", cNomEmpresa);
                parametros.put("PAR_TITULO", this.selectedTituloRelatorio.getDscTitulo());
                parametros.put("PAR_USUARIO", usuario.getIdUsuario());

                lPassa = true;
            } else if (nRel == 2) {
                cWhere = (String) session.getAttribute("filtroRelatorio");
                cOrder = (String) session.getAttribute("filtroOrder");
                session.setAttribute("tipRel", "acompanhamento");
                this.nomeRelatorio = "relatorio_acompanhamento_processo.jasper";
                this.nomePDF = "relatorio_acompanhamento_processo_".concat(usuarioTime).concat(".pdf");

                if (cWhere == null) {
                    cWhere = " ";
                }
                if (cOrder == null) {
                    cOrder = " ";
                }

                if (!cWhere.trim().isEmpty()) {
                    cWhere += " AND id_usuario = ".concat(usuario.getIdUsuario().toString()).concat(" ");
                } else {
                    cWhere = " WHERE id_usuario = ".concat(usuario.getIdUsuario().toString()).concat(" ");
                }

                lPassa = true;
            }
            if (lPassa) {
                this.executarRelatorio2(nomeRelatorio, parametros);
            }

            conecta.close();
            msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Chamada ao Relatório efetuada com Sucesso!", "RELATÓRIO DO FINANCEIRO!");
        } catch (SQLException | IOException ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "ATENÇÃO ... VERIFIQUE SE O ACROBAT READ ESTA INSTALADO ...");
        } catch (JRException ex) {
            Logger.getLogger(RelatorioBean.class.getName()).log(Level.SEVERE, null, ex);
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "ATENÇÃO ... VERIFIQUE SE EXISTE ALGUM RELATÓRIO JÁ ABERTO ...");
        } catch (JRRuntimeException ex) {
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao Chamar o Relatório!", "ATENÇÃO ... VERIFIQUE SE EXISTE ALGUM RELATÓRIO JÁ ABERTO ...");
        } finally {
            this.nrel = 1;
            this.nordem = 1;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void executarRelatorio2(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);

        if (!cWhere.isEmpty()) {
            parametros.put("PAR_WHERE", cWhere);
        }
        if (!cOrder.isEmpty()) {
            parametros.put("PAR_ORDER", cOrder);
        }
        parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));
        parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
        parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));
        parametros.put("LOGO", dirsub.concat("\\patricia_triunfo.png"));
        parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));

        //Preenche o relatório e exibe numa GUI
        JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());

        preenchePdf(impressao);

        conecta.close();

    }

    public void preenchePdf(JasperPrint print) throws JRException, IOException, JRRuntimeException {
        ctx = FacesContext.getCurrentInstance();
        ExternalContext ec = ctx.getExternalContext();
        // Pego o caminho completo do PDF desde a raiz
        saida = getDiretorioReal("/WEB-INF/relatorios/".concat(this.nomePDF));

        // Exporto para PDF
        JasperExportManager.exportReportToPdfFile(print, saida);
        ec.redirect(ec.getRequestContextPath() + "/relatorio");
        //java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

        //desktop.open(new File(saida));
    }

    public void enviarPdf(String nomeRelatorio, Map<String, Object> parametros) throws JRException, IOException, SQLException {
        FacesContext context = FacesContext.getCurrentInstance();
        String caminho = "/WEB-INF/relatorios/";
        String relatorio = caminho.concat(nomeRelatorio);

        UtilFaces utilFaces = new UtilFaces();
        String arquivo = utilFaces.getServletContext().getRealPath(relatorio);
        String dirsub = utilFaces.getServletContext().getRealPath(caminho);

        conecta = new Conecta();

        JRAbstractLRUVirtualizer virtualizer = new JRGzipVirtualizer(100);
        // Carrega o xml de definição do relatório
        try {
            HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
            // Configura o response para suportar o relatório
            response.setContentType("application/pdf");
            response.addHeader("Content-disposition", "inline; filename=\"" + this.nomePDF + "\"");
            //response.addHeader("Content-disposition", "attachment; filename=\"acionista.pdf\"");

            // Preenche o relatório com os parametros e o data source
            if (!cWhere.isEmpty()) {
                parametros.put("PAR_WHERE", cWhere);
            }
            if (!cOrder.isEmpty()) {
                parametros.put("PAR_ORDER", cOrder);
            }
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));
            parametros.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
            parametros.put("SUBREPORT_DIR", dirsub.concat(File.separator));
            parametros.put("LOGO", dirsub.concat("\\patricia_triunfo.png"));
            parametros.put(JRParameter.REPORT_LOCALE, new Locale("pt", "BR"));

            //Preenche o relatório e exibe numa GUI
            JasperPrint impressao = JasperFillManager.fillReport(arquivo, parametros, conecta.Conecta());
            // Exporta o relatório
            JasperExportManager.exportReportToPdfStream(impressao, response.getOutputStream());
            // Salva o estado da aplicação no contexto do JSF
            context.getApplication().getStateManager().saveView(context);
            // Fecha o stream do response
            context.responseComplete();
        } finally {
            try {
                conecta.close();
            } catch (SQLException ex) {
                //Logger.getLogger(ReportUtil.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    private String getDiretorioReal(String diretorio) {
        return session.getServletContext().getRealPath(diretorio);
    }

    public int getNrel() {
        return nrel;
    }

    public void setNrel(int nrel) {
        this.nrel = nrel;
    }

    public List<String> getSelectedCliente() {
        return selectedCliente;
    }

    public void setSelectedCliente(List<String> selectedCliente) {
        this.selectedCliente = selectedCliente;
    }

    public void handleClienteStatusChange() throws EaoException {
        String cFiltro;

        handleClienteChange();

        // PickList Cliente
        if (this.lcliente) {
            // Filtro do Cliente
            cFiltro = " sta_cliente in (";
            for (String cStatus : selectedCliente) {
                switch (cStatus) {
                    case "A":
                        cFiltro += "'A',";
                        break;
                    case "I":
                        cFiltro += "'I',";
                        break;
                    case "P":
                        cFiltro += "'P',";
                        break;
                }
            }
            cFiltro += "'X') ";

            List<Cliente> source = new ArrayList<>();
            List<Cliente> target = new ArrayList<>();

            source = ClienteJpa.getNative("Cliente", 0, ClienteJpa.getCount("Cliente"), null, true, null, null, cFiltro);

            clientePicks = new DualListModel<>(source, target);
        }
    }
}
